#ifndef _VIDEO_H_
#define _VIDEO_H_

#include "../include/defs.h"

//cantidad maxima de columnas
#define MAX_COL 80
//cantidad maxima de filas
#define MAX_ROW 25

//tamano de la pantalla sin los atributos de color
#define SCREEN_SIZE MAX_ROW*MAX_COL

//cantidad de pantallas que puede almacenar el buffer de video
#define NSCREENS 2

#define SCROLL_UP_DOWN 1

//Atributos de video
#define BLUE_TXT 0x01	//Letras azules, fondo negro
#define WHITE_TXT 0x07 	//Letras blancas, fondo negro

//macro que invierte los atributos de color
#define INV_ATTR(x) ((x & 0x70)?(x >> 4):(x << 4))

//zona de memoria pintada
typedef struct paintedSectionT {
	int xIni;
	int xFin;
	int yIni;
	int yFin;
	char colour;
	char isPainted;
} paintedSectionT;

typedef struct {
	int pos;
	int posx;
	int posy;
	int set_go_up;
	int cursorEnabled;
	paintedSectionT paintedSection;
	int scrolled;
	int flush;
	char attr;
	int bufferLimit;
	char videoBuffer[SCREEN_SIZE * 2 * NSCREENS];
	char *screenBeg;
	char *vidBuffPos;
	char *bufferFin;
	char *screenLast;
} videoBuff;

void videoBuffInit(videoBuff * vid);
int screen_write(videoBuff * vid, char * buffer, int cant);
int screen_set(videoBuff * vid, char * buff);
int screen_get(videoBuff * vid, char * buff);
void screen_clear(videoBuff * vid);

//mueve el puntero en la pantalla
void screen_pointer_move(videoBuff * vid, int * x, int * y);

//pinta la pantalla comprendida entre los valores pasados
void screen_paint(videoBuff * vid, int xIni, int yIni, int xFin, int yFin);

//devuelve 1 si el x y el y de los parametros esta dentro de
//la zona pintada
int is_inside_painted(videoBuff * vid, int x, int y);

//borra el puntero de la pantalla (no lo desactiva)
void screen_pointer_remove(videoBuff * vid);

//deja en buffer los chars dentro de la zona pintada
//y devuelve cuantos chars se guardaron
int screen_get_painted(videoBuff * vid, char * buffer);

//deja en buffer los chars dentro de la fila de la zona pintada
//y devuelve cuantos chars se guardaron
int screen_get_painted_line(videoBuff * vid, char * buffer, int y);

//devuelve las coordenadas de la zona seleccionada
paintedSectionT screen_get_selected_coords(videoBuff * vid);

//setea la posicion para imprimir
void screen_set_pos(videoBuff * vid, int x, int y);

//devuelve el x e y actual
void screen_get_pos(videoBuff * vid, int * x, int * y);

void buffer_video_clear(videoBuff * vid);

void screen_scroll_up(videoBuff * vid);

void screen_scroll_down(videoBuff * vid);

void buffer_video_painted(videoBuff * vid);

void flush_screen(videoBuff * vid);

void scrollFullScreen(videoBuff * vid);

//muestra o esconde el cursor
void show_hide_cursor(videoBuff * vid, int state);

//cambia el atributo actual de color de la video
void changeCurAttr(videoBuff * vid, char attr);


#endif
